﻿#ifndef XQHTTPHEADOBJECT_H
#define XQHTTPHEADOBJECT_H
#include<QNetworkRequest>
#include<QString>
#include<QHash>
#include<QJsonDocument>
#include"XQNework.h"
using HttpRequestType = Http::RequestType;
using HttpProtocol = Http::Protocol;
//using Header = QHash<QByteArray, QByteArray>;
class  XQHttpHeadObject
{
public:
	XQHttpHeadObject(const QByteArray& header = QByteArray());
	virtual ~XQHttpHeadObject()=default;
	friend class XQHttpServer;
	friend class XQHttpClient;
public:
	static Http::Versions getVersions(const QString& text);
public:
	virtual QByteArray toByteArray()const;
	//头部转字符串输出
	virtual QString toStrinng()const;
	//http获取版本
	Http::Versions versions()const;
	//协议版本转字符串输出
	QByteArray versions_toByteArray()const;
	QString versions_toString()const;
	//头部数据链接转QByteArray
	virtual QByteArray header_toByteArray()const;
	//头部数据链接转QString
	virtual QString header_toString()const;
public:
	//返回查看头部
	const QHash<QByteArray, QByteArray>& header()const;
	QHash<QByteArray, QByteArray>& header();
	//头部数据是否为空
	bool headerIsEmpty() const;
	QByteArray header(const QByteArray& headerName)const;
	QByteArray header(QNetworkRequest::KnownHeaders header)const;
	//返回主机地址
	QString host()const;
	//返回主机端口
	quint16 port()const;
	//返回主机地址和端口
	QString hostPort()const;
	//返回device指针
	QIODevice* device()const;
	//是否需要自动释放Dev
	bool isDeviceAutoDelete()const;
	//内容是否为空
	bool contentIsEmpty() const;
	//返回的头部记录的长度
	size_t headContentLength()const;
	//返回内容
	const QByteArray& content()const;
	//内容接收完毕
	bool isContentAcceptFinish();
	//内容转QString
	QString content_toString()const;
	//内容转json
	QJsonDocument content_toJson()const;
	//返回缓存
	const QByteArray& buffer()const;
	//返回累计的缓存大小
	quint64 buffSize()const;
	//缓存接收完毕
	bool isBuffAcceptFinish();
public:
	Http::Head type() const;
public:
	//解析设置http头部数据
	virtual void setData(const QByteArray& header);
	//设置版本信息
	void setVersions(Http::Versions type);
	//设置头部
	void setHeader(const QByteArray& headerName, const QByteArray& headerValue);
	void setHeader(QNetworkRequest::KnownHeaders header, const QByteArray& headerValue);
	void setHeader(const QByteArrayList& data);
	//设置头部Date 日期时间
	void setHeader_Date(const QDateTime& date);
	//设置内容长度(头部)
	void setHeadContentLength(size_t len);
	//删除头部
	void removeHeader(const QByteArray& headerName);
	//头部数据清空
	void clearHeader();
	//清空
	virtual void clear();
	//设置内容 互斥的setDevice
	void setContent(const QByteArray& data);
	//两种是互斥的setContent
	void setDevice(QIODevice* dev, bool AutoDelete = false);
	//设置主机(带端口)
	void setHostPort(QString host, quint16 port);
	//追加缓存数据
	void addBuffer(const QByteArray& data);
	//清空缓存
	void clearBuffer();
protected:
	virtual void init();
protected:
	QHash<QByteArray, QByteArray> m_header;//头部数据
	Http::Versions m_versions;//http版本类型
	QIODevice* m_dev = nullptr;
	bool m_devAutoDelete = false;//自动释放m_dev内存
	QByteArray m_data;//内容
	QByteArray m_buffer;//缓存
	Http::Head m_type;//类型

};
#endif